package com.ocl.www.utils;

import java.io.*;
import java.util.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ocl.www.service.QiniuService;
//import org.apache.commons.fileupload.FileItem;
//import org.apache.commons.fileupload.FileUploadBase;
//import org.apache.commons.fileupload.ProgressListener;
//import org.apache.commons.fileupload.disk.DiskFileItemFactory;
//import org.apache.commons.fileupload.servlet.ServletFileUpload;
//import org.apache.commons.io.IOUtils;
//import org.apache.commons.net.ftp.FTPClient;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.ocl.www.domain.User;
import com.ocl.www.service.UserService;

@RestController
@RequestMapping("/fileuploadutils")
public class FileUploadUtils {

	@Autowired
	private UserService userService;
	@Autowired
	private EhCacheManager em;
	@Autowired
	private QiniuService qiniuService;

	private Logger log = Logger.getLogger(FileUploadUtils.class);

	@ResponseBody
    @RequestMapping(value = "/upload", produces = { "application/json" }, method =RequestMethod.POST )
    public void upload(@RequestParam(value = "logo", required = true) MultipartFile logo,
    		HttpServletRequest request, HttpServletResponse response){

        //得到上传文件的保存目录，将上传的文件存放于WEB-INF目录下，不允许外界直接访问，保证上传文件的安全
        String savePath = request.getServletContext().getRealPath(File.separator+"upload");
        //上传时生成的临时文件保存目录
        String tempPath = request.getServletContext().getRealPath(File.separator+"temp");
        File tmpFile = new File(tempPath);
        if (!tmpFile.exists()) {
            //创建临时目录
            tmpFile.mkdir();
        }
		//消息提示
        String message = "";
        String picpath = null;
    	//这里的logo就是接受的文件了
//	    if(logo!=null){
			/************************************* FTP 实现方式****************************************/
//	       //进行操作吧
//	          //System.out.println(logo.getOriginalFilename());
//	          String filename = logo.getOriginalFilename();
//			log.info(filename);
//	          //注意：不同的浏览器提交的文件名是不一样的，有些浏览器提交上来的文件名是带有路径的，如：  c:\a\b\1.txt，而有些只是单纯的文件名，如：1.txt
//	          //处理获取到的上传文件的文件名的路径部分，只保留文件名部分
//	          filename = filename.substring(filename.lastIndexOf(File.separator)+1);
//	          //得到上传文件的扩展名
//	          String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
//	          //如果需要限制上传的文件类型，那么可以通过文件的扩展名来判断上传的文件类型是否合法
//			log.info("上传的文件的扩展名是："+fileExtName);
//	          //获取item中的上传文件的输入流
//	          //InputStream in;
//			FTPClient ftpClient = new FTPClient();
//			InputStream fis = null;
//
//			try {
//				ftpClient.connect("127.0.0.1");
//				ftpClient.login("callbell", "000000");
////
////				File srcFile = new File("C:\\new.gif");
//				fis = logo.getInputStream();
//
//				//得到文件保存的名称
//				String saveFilename = makeFileName(filename);
//				log.info("saveFilename:"+saveFilename);
//				//得到文件的保存目录
//				String realSavePath = makePath(saveFilename, savePath);
//				log.info("realSavePath:"+realSavePath);
//				String workdir = realSavePath.substring(realSavePath.indexOf("upload"),realSavePath.length());
//				log.info("ftp--path:"+workdir);
//				String savepathforftp = "/"+workdir+"/"+saveFilename;
//				log.info("存储路径："+savepathforftp);
//
//				//判断是否存在文件夹
//				//设置上传目录
//				if(!ftpClient.changeWorkingDirectory(workdir)){
//					if(ftpClient.makeDirectory(workdir)){
//						ftpClient.changeWorkingDirectory(workdir);
//		//				ftpClient.changeWorkingDirectory(workdir);
//						ftpClient.setBufferSize(1024);
//						ftpClient.setControlEncoding("GBK");
//						//设置文件类型（二进制）
//						ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//						ftpClient.storeFile(saveFilename, fis);
//					}else {
//						System.out.println("创建目录失败");
////						return UploadStatus.Create_Directory_Fail;
//					}
//				}
//
//				User user = new User();
//				log.info("secu : "+ SecurityUtils.getSubject().getPrincipals().asList());
//				Set<?> s = SecurityUtils.getSubject().getPrincipals().asSet();
//				Object[] obj = new Object[2];
//				int obji = 0;
//				Iterator<?> it = s.iterator();
//				while(it.hasNext()){
//					obj[obji] = it.next();
//					log.info(obj.getClass());
//					log.info(obj.toString());
//					obji++;
//				}
//				Map<String,String> map = (Map<String, String>) obj[1];
//				String userId = map.get("userId").toString();
//
//				int c = 0;
////				String jieguo = picpath.substring(picpath.indexOf("upload"),picpath.length());
//				System.out.println("路径转义："+savepathforftp);
//				user.setHeadImage(savepathforftp);
//				user.setUserId(Integer.valueOf(userId));
//				c = userService.updateUserheadImg(user);
//			} catch (IOException e) {
//				e.printStackTrace();
//				throw new RuntimeException("FTP客户端出错！", e);
//			} finally {
//				IOUtils.closeQuietly(fis);
//				try {
//					ftpClient.disconnect();
//				} catch (IOException e) {
//					e.printStackTrace();
//					throw new RuntimeException("关闭FTP连接发生异常！", e);
//				}
//			}

//		}
			/************************************* 七牛（第三方）服务实现方式****************************************/

		if(logo!=null){
			String filename = logo.getOriginalFilename();
			//得到文件保存的名称
			String saveFilename = makeFileName(filename);
			InputStream is = null;
			try {
				is = logo.getInputStream();
				qiniuService.init();
				qiniuService.uploadFile(saveFilename,is);
			} catch (Exception e) {
				e.printStackTrace();
			}

			User user = new User();
			log.info("secu : "+ SecurityUtils.getSubject().getPrincipals().asList());
			Set<?> s = SecurityUtils.getSubject().getPrincipals().asSet();
			Object[] obj = new Object[2];
			int obji = 0;
			Iterator<?> it = s.iterator();
			while(it.hasNext()){
				obj[obji] = it.next();
				log.info(obj.getClass());
				log.info(obj.toString());
				obji++;
			}
			Map<String,String> map = (Map<String, String>) obj[1];
			String userId = map.get("userId").toString();

			int c = 0;
//				String jieguo = picpath.substring(picpath.indexOf("upload"),picpath.length());
			System.out.println("路径："+File.separator+saveFilename);
			user.setHeadImage(File.separator+saveFilename);
			user.setUserId(Integer.valueOf(userId));
			c = userService.updateUserheadImg(user);

		}

    }

	     /**
	     * @Method: makeFileName
	     * @Description: 生成上传文件的文件名，文件名以：uuid+"_"+文件的原始名称
	     * @Anthor:孤傲苍狼
	     * @param filename 文件的原始名称
	     * @return uuid+"_"+文件的原始名称
	     */ 
	     private String makeFileName(String filename){  //2.jpg
	         //为防止文件覆盖的现象发生，要为上传文件产生一个唯一的文件名
	         return UUID.randomUUID().toString() + "_" + filename;
	     }
	     
	     /**
	      * 为防止一个目录下面出现太多文件，要使用hash算法打散存储
	     * @Method: makePath
	     * @Description: 
	     * @Anthor:孤傲苍狼
	     *
	     * @param filename 文件名，要根据文件名生成存储目录
	     * @param savePath 文件存储路径
	     * @return 新的存储目录
	     */ 
	     private String makePath(String filename,String savePath){
	         //得到文件名的hashCode的值，得到的就是filename这个字符串对象在内存中的地址
	         int hashcode = filename.hashCode();
	         int dir1 = hashcode&0xf;  //0--15
	         int dir2 = (hashcode&0xf0)>>4;  //0-15
	         //构造新的保存目录
	         String dir = savePath + File.separator + dir1 + File.separator + dir2;  //upload\2\3  upload\3\5
	         //File既可以代表文件也可以代表目录
	         File file = new File(dir);
	         //如果目录不存在
	         if(!file.exists()){
	             //创建目录
	             file.mkdirs();
	         }
	         return dir;
	     }
	     
	     
	     @ResponseBody
	     @RequestMapping(value = "/uploadtemp", produces = { "application/json" }, method =RequestMethod.POST )
	     public Map<String,Object> uploadtemp(@RequestParam(value = "logo", required = true) MultipartFile logo,
	     		HttpServletRequest request, HttpServletResponse response){
	    	 System.out.println("开始上传。。。");
	         //得到上传文件的保存目录，将上传的文件存放于WEB-INF目录下，不允许外界直接访问，保证上传文件的安全
	         String savePath = request.getServletContext().getRealPath(File.separator+"upload");
	         //上传时生成的临时文件保存目录
	         String tempPath = request.getServletContext().getRealPath(File.separator+"temp");
	         File tmpFile = new File(tempPath);
	         if (!tmpFile.exists()) {
	             //创建临时目录
	             tmpFile.mkdir();
	         }
	         
	         //消息提示
	         String message = "";
	         Map<String,Object> map = new HashMap<String,Object>();
	         String picpath = null;
			 /************************************* FTP 实现方式****************************************/
	     	//这里的logo就是接受的文件了
//	 	    if(logo!=null){
//				//进行操作吧
//				//System.out.println(logo.getOriginalFilename());
//				String filename = logo.getOriginalFilename();
//				System.out.println(filename);
//				//注意：不同的浏览器提交的文件名是不一样的，有些浏览器提交上来的文件名是带有路径的，如：  c:\a\b\1.txt，而有些只是单纯的文件名，如：1.txt
//				//处理获取到的上传文件的文件名的路径部分，只保留文件名部分
//				filename = filename.substring(filename.lastIndexOf(File.separator)+1);
//				//得到上传文件的扩展名
//				String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
//				//如果需要限制上传的文件类型，那么可以通过文件的扩展名来判断上传的文件类型是否合法
//				System.out.println("上传的文件的扩展名是："+fileExtName);
//				//获取item中的上传文件的输入流
//				FTPClient ftpClient = new FTPClient();
//				InputStream fis = null;
//
//				try {
//					ftpClient.connect("127.0.0.1");
//					ftpClient.login("callbell", "000000");
//
//					fis = logo.getInputStream();
//					//得到文件保存的名称
//					String saveFilename = makeFileName(filename);
//					log.info("saveFilename:"+saveFilename);
//					//得到文件的保存目录
//					String realSavePath = makePath(saveFilename, savePath);
//					log.info("realSavePath:"+realSavePath);
//					String workdir = realSavePath.substring(realSavePath.indexOf("upload"),realSavePath.length());
//					log.info("ftp--path:"+workdir);
//					String savepathforftp = "/"+workdir+"/"+saveFilename;
//					log.info("存储路径："+savepathforftp);
//
//					//判断是否存在文件夹
//					//设置上传目录
//					if(!ftpClient.changeWorkingDirectory(workdir)){
//						if(ftpClient.makeDirectory(workdir)){
//							ftpClient.changeWorkingDirectory(workdir);
//							//				ftpClient.changeWorkingDirectory(workdir);
//							ftpClient.setBufferSize(1024);
//							ftpClient.setControlEncoding("GBK");
//							//设置文件类型（二进制）
//							ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
//							ftpClient.storeFile(saveFilename, fis);
//						}else {
//							System.out.println("创建目录失败");
//						}
//					}
////					 System.out.println("结束上传。。。"+picpath);
////					 String jieguo = picpath.substring(picpath.indexOf("/upload"),picpath.length());
////					 System.out.println("路径转义："+jieguo);
//					 map.put("path", savepathforftp);
//					 return map;
//	 			} catch (IOException e) {
//	 				// TODO Auto-generated catch block
//	 				e.printStackTrace();
//	 			}
//
//	 	    }

			 if(logo!=null){
				 String filename = logo.getOriginalFilename();
				 //得到文件保存的名称
				 String saveFilename = makeFileName(filename);
				 InputStream is = null;
				 try {
					 is = logo.getInputStream();
					 qiniuService.init();
					 qiniuService.uploadFile(saveFilename,is);
				 } catch (Exception e) {
					 e.printStackTrace();
				 }
				 map.put("path", File.separator+saveFilename);
			 }
			return map;
	     }

}
